Join-алгоритмы и сортировки
Зачем это знать:
-
Часто “медленно” — это не индекс, а join/сортировка/агрегация.
-
Выбор join-алгоритма зависит от кардинальностей и индексов.
Связанные темы:
Планировщик запросов и EXPLAIN
Память, кэш и I/O
Join-алгоритмы
Nested Loop
-
Хорош при малом внешнем наборе и индексируемом внутреннем.
-
Плох при больших объёмах: “внешние строки × поиск во внутреннем”.
Hash Join
-
Строит хэш-таблицу по одному входу и пробегает другим.
-
Обычно хорош для средних/больших объёмов, если хватает памяти.
-
Если памяти не хватает — может “разливаться” на диск (становится резко хуже).
Merge Join
-
Требует отсортированные входы (или сортирует).
-
Хорош, когда входы уже отсортированы по ключу join или сортировка дешёвая.
Сортировки и work_mem
- Sort может быть:
- в памяти (быстро),
-
на диске (temp files) — резко медленнее.
-
На практике часто причина — не хватает work_mem на конкретный запрос/узел.
(Тонкая настройка — DBA, но понимать симптоматику важно.)